package org.go.test;

import java.io.File;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Dom {
	Document document = null;

	public static void main(String[] args) {
		new Dom().readXML("c:/web.xml");
	}

	/**
	 * 读取XML文档
	 *
	 * @param xml文件路径名
	 */
	public void readXML(String xmlFileName) {
		// 先解析构建一个Document对象
		this.builderDocument(xmlFileName);
		// 获取根元素，因为只有一个
		Element element = document.getDocumentElement();
		System.out.println("根元素：" + element.getNodeName() + "\n");
		// 获取根元素下的子节点集合
		NodeList nodeList = element.getChildNodes();
		// 使用递归遍历子节点集合中每个节点的信息
		loopNode(nodeList);
	}

	public void readXML(InputStream inputStream) {
		// 先解析构建一个Document对象
		this.builderDocument(inputStream);
		// 获取根元素，因为只有一个
		Element element = document.getDocumentElement();
		System.out.println("根元素：" + element.getNodeName() + "\n");
		// 获取根元素下的子节点集合
		NodeList nodeList = element.getChildNodes();
		// 使用递归遍历子节点集合中每个节点的信息
		loopNode(nodeList);
	}

	private void builderDocument(InputStream inputStream) {
		try {
			// 使用DocumentBuilderFactory工厂类实例化一个DocumentBuilder类对象。
			DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
			// 使用parse方法解析xml文件，生成一个Document对象
			document = builder.parse(inputStream);
			if (document == null)
				throw new NullPointerException("构建Document失败,Document为null");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/*
	 * 构建XML文档的Document对象
	 * @xmlFileName xml文件路径
	 */
	private void builderDocument(String xmlFileName) {
		if (xmlFileName == null || xmlFileName.length() == 0)
			throw new NullPointerException("构建Document对象时，所需的xml文件的文件名不能为null或者empty");
		try {
			// 使用DocumentBuilderFactory工厂类实例化一个DocumentBuilder类对象。
			DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
			// 使用parse方法解析xml文件，生成一个Document对象
			document = builder.parse(new File(xmlFileName));
			if (document == null)
				throw new NullPointerException("构建Document失败,Document为null");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 使用递归循环xml中的每个节点
	 *
	 * @param nodeList 节点集合
	 */
	private void loopNode(NodeList nodeList) {
		for (int i = 0; i < nodeList.getLength(); i++) {
			Node node = nodeList.item(i);
			if ("note".equals(node.getNodeName())) {
				System.out.println("分类为：" + node.getAttributes().getNamedItem("category").getNodeValue());
				// 如果note节点有子节点，则开始递归
				if (node.hasChildNodes())
					loopNode(node.getChildNodes());
			} else if ("title".equals(node.getNodeName())) {
				System.out.println("标题：" + node.getTextContent());
			} else if ("message".equals(node.getNodeName())) {
				System.out.println("详细信息：" + node.getTextContent() + "\n");
			}
		}
	}
}